[bits 64]

extern handler_table

section .text

%macro INTERRUPT_HANDLER 2
interrupt_handler_%1:
%ifn %2
    push qword 0x20241020 ; 压入魔数
%endif
    push rax
    mov rax, es
    push rax
    mov rax, ds
    push rax
    push rbp
    push rdi
    push rsi
    push rdx
    push rcx
    push rbx
    push r8
    push r9
    push r10
    push r11
    push r12
    push r13
    push r14
    push r15
    mov rdi, %1 ; 传参中断向量号
    jmp interrupt_entry
%endmacro

interrupt_entry:
    ; 调用中断处理函数
    call [handler_table + rdi * 8]
    ; 恢复压入的参数
    pop r15
    pop r14
    pop r13
    pop r12
    pop r11
    pop r10
    pop r9
    pop r8
    pop rbx
    pop rcx
    pop rdx
    pop rsi
    pop rdi
    pop rbp
    pop rax
    mov ds, rax
    pop rax
    mov es, rax
    pop rax
    add rsp, 8  ; 魔数或错误码
    iretq

INTERRUPT_HANDLER 0x00, 0   ; Divide Error
INTERRUPT_HANDLER 0x01, 0   ; Debug Exception
INTERRUPT_HANDLER 0x02, 0   ; NMI
INTERRUPT_HANDLER 0x03, 0   ; Breakpoint
INTERRUPT_HANDLER 0x04, 0   ; Overflow
INTERRUPT_HANDLER 0x05, 0   ; Bound Range Exceeded
INTERRUPT_HANDLER 0x06, 0   ; Undefined Opcode
INTERRUPT_HANDLER 0x07, 0   ; Device Not Available
INTERRUPT_HANDLER 0x08, 1   ; Double Fault
INTERRUPT_HANDLER 0x09, 0   ; Coprocessor Segment Overrun
INTERRUPT_HANDLER 0x0a, 1   ; Invalid TSS
INTERRUPT_HANDLER 0x0b, 1   ; Segment Not Present
INTERRUPT_HANDLER 0x0c, 1   ; Stack Segment Fault
INTERRUPT_HANDLER 0x0d, 1   ; General Protection
INTERRUPT_HANDLER 0x0e, 1   ; Page Fault
INTERRUPT_HANDLER 0x0f, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x10, 0   ; x87 FPU Floating-Point Error
INTERRUPT_HANDLER 0x11, 1   ; Alignment Check
INTERRUPT_HANDLER 0x12, 0   ; Machine Check
INTERRUPT_HANDLER 0x13, 0   ; SIMD Floating-Point Exception
INTERRUPT_HANDLER 0x14, 0   ; Virtualization Exception
INTERRUPT_HANDLER 0x15, 1   ; Control Protection Exception
INTERRUPT_HANDLER 0x16, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x17, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x18, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x19, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x1a, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x1b, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x1c, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x1d, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x1e, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x1f, 0   ; Intel Reserved
INTERRUPT_HANDLER 0x20, 0   ; Clock Interrupt 时钟中断
INTERRUPT_HANDLER 0x21, 0   ; Reserved
INTERRUPT_HANDLER 0x22, 0   ; Reserved
INTERRUPT_HANDLER 0x23, 0   ; Reserved
INTERRUPT_HANDLER 0x24, 0   ; Reserved
INTERRUPT_HANDLER 0x25, 0   ; Reserved
INTERRUPT_HANDLER 0x26, 0   ; Reserved
INTERRUPT_HANDLER 0x27, 0   ; Reserved
INTERRUPT_HANDLER 0x28, 0   ; RTC 实时时钟
INTERRUPT_HANDLER 0x29, 0   ; Reserved
INTERRUPT_HANDLER 0x2a, 0   ; Reserved
INTERRUPT_HANDLER 0x2b, 0   ; Reserved
INTERRUPT_HANDLER 0x2c, 0   ; Reserved
INTERRUPT_HANDLER 0x2d, 0   ; Reserved
INTERRUPT_HANDLER 0x2e, 0   ; Reserved
INTERRUPT_HANDLER 0x2f, 0   ; Reserved

section .data
; 存放中断函数入口地址
global handler_entry_table
handler_entry_table:
    dq interrupt_handler_0x00
    dq interrupt_handler_0x01
    dq interrupt_handler_0x02
    dq interrupt_handler_0x03
    dq interrupt_handler_0x04
    dq interrupt_handler_0x05
    dq interrupt_handler_0x06
    dq interrupt_handler_0x07
    dq interrupt_handler_0x08
    dq interrupt_handler_0x09
    dq interrupt_handler_0x0a
    dq interrupt_handler_0x0b
    dq interrupt_handler_0x0c
    dq interrupt_handler_0x0d
    dq interrupt_handler_0x0e
    dq interrupt_handler_0x0f
    dq interrupt_handler_0x10
    dq interrupt_handler_0x11
    dq interrupt_handler_0x12
    dq interrupt_handler_0x13
    dq interrupt_handler_0x14
    dq interrupt_handler_0x15
    dq interrupt_handler_0x16
    dq interrupt_handler_0x17
    dq interrupt_handler_0x18
    dq interrupt_handler_0x19
    dq interrupt_handler_0x1a
    dq interrupt_handler_0x1b
    dq interrupt_handler_0x1c
    dq interrupt_handler_0x1d
    dq interrupt_handler_0x1e
    dq interrupt_handler_0x1f
    dq interrupt_handler_0x20
    dq interrupt_handler_0x21
    dq interrupt_handler_0x22
    dq interrupt_handler_0x23
    dq interrupt_handler_0x24
    dq interrupt_handler_0x25
    dq interrupt_handler_0x26
    dq interrupt_handler_0x27
    dq interrupt_handler_0x28
    dq interrupt_handler_0x29
    dq interrupt_handler_0x2a
    dq interrupt_handler_0x2b
    dq interrupt_handler_0x2c
    dq interrupt_handler_0x2d
    dq interrupt_handler_0x2e
    dq interrupt_handler_0x2f